/**
 * <p>根据页面的properties文件URL取得字段描述</p>
 * @class
 * @param url 页面的properties文件URL
 */
zxt.i18n.Bundle = function(url){
	this._url = url;
	this._mstrs = new Object();
	this._state = -1; // -1, 0, 1;
};

/**
 * <p>状态标识，用来区分是否已加载properties文件</p>
 * @function
 * @param v
 * @return {int} 1表示已加载，-1表示未加载，0表示不存在properties文件
 */
zxt.i18n.Bundle.prototype.state = function(v) {
	return this._state;
};

/**
 * <p>注册KEY及描述</p>
 * @function
 * @param key zxt.key 
 * @param val 描述
 * @return
 */
zxt.i18n.Bundle.prototype.register = function(key, val){
	this._mstrs[key] = val;
};

/**
 * <p>返回页面字段描述集合</p>
 * @function
 * @return 页面字段描述集合
 */
zxt.i18n.Bundle.prototype.entries = function(){
	if (this._state == -1 ) this._load();
	return this._mstrs;
};	

/**
 * <p>获得指定KEY的描述</p>
 * @function
 * @param key 页面字段zxt.key
 * @return 描述
 */
zxt.i18n.Bundle.prototype.getString = function(key){
	if (this._state == -1 ) this._load();
	
	var ret = this._mstrs[key];
	if (zxt.util.notValue(ret)) return null;	
	return ret;
};	

/**
 * <p>加载页面的properties文件 </p>
 * @function
 * @private
 * @return
 */
zxt.i18n.Bundle.prototype._load = function(){
	if ( this._state != -1  ) return;
		
	var lLine = null;	
	$.ajax({
   			type: "GET",
   			async: false,
   			url:   this._url,
   			data: {},
   			dataType: "text",
   			success: function(txt){
   	  			lLine = txt;//保存结果
    		},
   			error: function(xml,eType,e){	                   	
        		
    		}
 		});
 	
 	if (lLine == null){
 		this._state = 0;
 		return;
 	};
 	
 	var lines=lLine.split(/\r?\n/);
 	for( var i=0; i<lines.length; i++ ){
		var line1 = lines[i];
		var idx = line1.indexOf("=");		
		var key = line1.substr(0, idx);		
		var val = line1.substr(idx+1);
		this.register(key, val);
	};	
	this._state = 1;
};

/**
 * <p>
 * 页面翻译器
 * </p>
 * @class
 * @param parent
 */
zxt.i18n.Localizer = function(parent){
	this._parent = parent;
	this._bundles = {};	
};

/**
 * <p>设置父窗口页面的页面翻译器</p>
 * @function
 * @param   父窗口页面的页面翻译器
 * @return  {zxt.i18n.Localizer}父窗口页面的页面翻译器
 */
zxt.i18n.Localizer.prototype.parent = function(v){
	if (v === undefined) {	return this._parent;	};
	this._parent = v;
};	

/**
 * <p>页面国际化处理</p>
 * @function
 * @param key   zxt.key 页面字段ID
 * @param locale 国际化文件配置后缀标识
 * @return 如果在当前页面没有找到字段描述，则取父窗口页面的字段国际化配置；
 *         如果没有设置父窗口页面的字段国际化配置页面翻译器，则返回null
 */
zxt.i18n.Localizer.prototype.localize = function(key, locale){
	var tval = this._localize(key, locale);
	if ( zxt.util.isValue(tval) ) return tval;		
	if ( !zxt.util.isValue(this._parent) ) return null;	
	return this._parent.localize(key, locale);
};	

/**
 * <p>页面国际化处理</p>
 * @private
 * @param key
 * @param local
 * @return
 */
zxt.i18n.Localizer.prototype._localize = function(key, local){
	if ( zxt.util.isUndefined(local) ){
		local = $zxt.LOCAL;
	};	
	
	var url = "./" + $zxt.PAGE + "_" + local + ".properties";	
	var bundle = this._bundles[url];
	if ( !zxt.util.isValue(bundle) ){
		bundle = new zxt.i18n.Bundle(url);
		this._bundles[url] = bundle;
	};		
	
	var ret = bundle.getString(key);//取国际化字段描述	
	if ( zxt.util.isValue(ret) ) return ret;	
	
	//当前页面国际化获得描述为undefined，则到公共的设置取描述
	if ( zxt.util.isString(zxt.cfg.i18nPATH) && zxt.util.isString(zxt.cfg.i18nNAME)){
			url = zxt.cfg.i18nPATH + "/" + zxt.cfg.i18nNAME + "_" + local + ".properties";	
			bundle = this._bundles[url];
			if ( !zxt.util.isValue(bundle) ){
				bundle = new zxt.i18n.Bundle(url);
				this._bundles[url] = bundle;
			};
			ret = bundle.getString(key);
			return ret;	
	};	

	return null;
};
/**
 * <p>国际化
 * 支持形如#XXX#$VAlue$国际化配置</p>
 * @function
 * @param str 读入的字符串
 * @param locale 页面proerties文件定位
 * @return 返回国际化后的值
 */
zxt.i18n.Localizer.prototype.translate = function(str, locale){	
	var regex = /^#.+#*$/;
	if( regex.test(str) ){
		var key = str.substring(1, str.lastIndexOf('#'));
		var lstr = this.localize(key, locale);
		if ( zxt.util.isValue(lstr) ) return lstr+str.substring(str.lastIndexOf('#')+1, str.length);;
	};	
	return str;	
};	





